//引入vue
import Vue from "vue"
//引入加密
// import CryptoJS from '@/uni_modules/crypto-js/crypto-js.js';
//实例化vue对象
const app = new Vue()

/**
 * 构建上传文件请求
 */
function upload(query_url, file, params = {}, name = 'file', success_callback, fail_callback, after_callback, authenticate = false, combine = true)
{
	//发起请求
	return build(query_url, params, 'POST', success_callback, fail_callback, after_callback, authenticate, combine, true, {file: file, name: name});
}

/**
 * 构建请求
 */
function build(query_url, params = {}, method = 'POST', success_callback, fail_callback, after_callback, authenticate = false, combine = true, upload_request = false, uploader = {}) {
	
	//获取配置参数
	const envConfig = process.projectEnv;
	//检测是否需要验证登录
	if (authenticate && !app.nii_common.auth.check()) {
		//截断请求
		return false;
	}
	console.log(query_url);
	//判断链接信息
	if (typeof query_url !== 'undefined' && query_url.length > 0) {
		//整理基础方法
		const func = function (res) {
			// console.log(res)
			//判断是否存在请求后回调
			if (typeof after_callback == 'function') {
				//执行回调
				after_callback();
			}
			// console.log(res);
			//判断执行状态
			if (res.state) {
				//判断元素是否存在
				if (typeof (res.data.token) !== 'undefined') {
					//保存accessToken
					uni.setStorageSync(envConfig.AUTHENTICATE_ALIAS, res.data.token);
				}
				//判断是否存在成功回调
				if (typeof success_callback == 'function') {
					//执行回调
					success_callback(res);
				}
			} else {console.log(res);
				//判断是否存在失败回调
				if (typeof (fail_callback) == 'function') {
					// res.msg = JSON.parse(unescape(res.msg.replace(/\\u/g, '%u')));
					console.log(res);
					//执行回调
					fail_callback(res);
					
				}
				//判断是否需要重新获取凭证
				if(res.msg == '__MISSING_PERMISSION__') {
					app.nii_common.navigate.action('oauth', {}, 'redirect');
				}
			}
		};
		//获取设备信息
		// var device_data = uni.getStorageSync(envConfig.DEVICE_DATA_ALIAS);
		// //判断设备信息
		// if (typeof device_data == 'undefined' || uni.$u.test.isEmpty(device_data)) {
		// 	//设置新数据
		// 	let system_info = uni.getSystemInfoSync();
		// 	//设置设备信息
		// 	device_data = {
		// 		deviceId: system_info.deviceId,
		// 		deviceModel: system_info.deviceModel,
		// 		devicePixelRatio: system_info.devicePixelRatio,
		// 		osName: system_info.osName,
		// 		osVersion: system_info.osVersion,
		// 		platform: system_info.uniPlatform
		// 	};
		// 	//设置storage
		// 	uni.setStorageSync(envConfig.DEVICE_DATA_ALIAS, device_data);
		// }
		// //默认加入设备数据
		// params['__device__'] = device_data;
		//设置当前版本
		// params['__version__'] = envConfig.VERSION;
		// params['__version_num__'] = envConfig.VERSION_NUMBER;
		//获取源参数
		let unencrypt_params = params;
		//判断是否需要组合域名
		if (combine) {
			//整理域名
			const domain = envConfig.REQUEST_BASIC_DOMAIN;
			// // #ifndef H5
			// 	//整理链接
			// 	query_url = domain + 'api/app/' + query_url;
			// // #endif
			// // #ifdef H5
			// 	//判断是否开发环境
			// 	if (envConfig.APP_ENV == 'production') {
			// 		//整理链接
			// 		query_url = domain + 'api/app/' + query_url;
			// 	} else {
			// 		//设置链接
			// 		query_url = '/api/app/' + query_url;
			// 	}
			// // #endif
			// console.log(query_url);
			// //判断是否为上传请求
			// if (!upload_request) {			
			// 	//整理参数
			// 	// params = encryptData(params, envConfig.REQUEST_AES_ENCRYPT_KEY, envConfig.REQUEST_AES_IV, '__encrypt__');	
			// }
			//整理链接
			query_url = domain + 'api/app/' + query_url;
		}
		//判断是否开发环境
		if (envConfig.APP_ENV !== 'production') {
			//调试信息
			console.log('request：'+query_url);
			console.log('params：'+JSON.stringify(unencrypt_params));
		}
		//判断是否为上传请求
		if (upload_request) {
			//上传文件爱你
			uni.uploadFile({
				url: query_url,
				filePath: uploader['file'],//filePath: uploader['file']['path'],
				name: uploader['name'],
				formData: params,
				header: {
					'X-ACCESS-TOKEN': uni.getStorageSync(envConfig.AUTHENTICATE_ALIAS), 
				},
				success: (res) => {
					//整理信息
					res = JSON.parse(res.data);
					//判断是否开发环境
					if (envConfig.APP_ENV !== 'production') {
						//调试信息
						console.log(res);
					}
					//执行成功
					func(res);
				},
				fail: (res) => {
					console.log(res);
					//提示失败
					app.nii_common.toastAlert('网络错误，请稍后再试', 'none', 2000);
				}
			});
		} else {
			//发起请求
			uni.request({
				url: query_url,
				data: params,
				header: {
					'token': uni.getStorageSync(envConfig.AUTHENTICATE_ALIAS), 
				},
				method: method,
				dataType: 'json',
				success: (res) => {
					//判断是否开发环境
					if (envConfig.APP_ENV !== 'production') {
						//调试信息
						console.log(res);
						console.log(res.data);
					}
					if(res.statusCode != 200){
						//判断是否存在失败回调
						if (typeof (fail_callback) == 'function') {
							if(res.statusCode == 408){
								app.nii_common.navigate.action('oauth', {}, 'redirect');
							} else {
								res.header.msg = JSON.parse(unescape(res.header.msg.replace(/\\u/g, '%u')));
								//执行回调
								fail_callback(res.header);
							}
						}
					}else{
						//执行成功
						func(res.data);
					}
				},
				fail: (res) => {
					console.log(res);
					//提示失败
					app.nii_common.toastAlert('连接断开', 'none', 2000);
				}
			});	
		}
	}
	//返回成功
	return true;
}

/**
 * 加密参数
 * @param {*} encrypt_params 
 * @param {*} aes_key 
 * @param {*} aes_iv 
 * @param {*} encrypt_key 
 */
function encryptData(encrypt_params, aes_key, aes_iv, encrypt_key = '__encrypt__')
{
	//初始化参数
	var params = {};
	//判断是否为对象
	if (typeof (encrypt_params) === 'object') {
		//判断为空对象
		if (uni.$u.test.isEmpty(encrypt_params)) {
			//添加默认参数
			encrypt_params['__RANDOM_STRING__'] = uni.$u.random(10000, 99999);
		}
		//转义信息
		var encrypt_string = JSON.stringify(encrypt_params);
		//整理参数
		aes_key = CryptoJS.enc.Utf8.parse(aes_key);
		aes_iv = CryptoJS.enc.Utf8.parse(aes_iv);
		//加密
		params[encrypt_key] = CryptoJS.AES.encrypt(encrypt_string, aes_key, {
			iv: aes_iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.ZeroPadding
		}).toString();
	}
	//返回参数
	return params;
}

//暴露方法
module.exports = {
	build: build,
	upload: upload
}